package com.example.cardgame.model1

import java.io.Serializable

// 定义 CardMatchingGame 类，实现 Serializable 接口以支持序列化
class CardMatchingGame(val count: Int) : Serializable {
    // 分数，初始值为0，只能通过类内部方法修改
    var score = 0
        private set

    // 设置分数的方法
    fun setScore(newScore: Int) {
        score = newScore
    }

    // 卡片列表，包含游戏中的所有卡片
    val cards: MutableList<Card>

    // 初始化块，创建一个新的牌堆并从中抽取指定数量的卡片
    init {
        val deck = Deck()
        cards = mutableListOf()
        for (i in 1..count) {
            val card: Card? = deck.drawRandomCard()
            if (card != null) {
                cards.add(card)
            }
        }
    }

    // 重置游戏的方法，重新生成牌堆并抽取卡片，分数重置为0
    fun reset() {
        val deck = Deck()
        cards.clear()
        for (i in 1..count) {
            val card: Card? = deck.drawRandomCard()
            if (card != null) {
                cards.add(card)
            }
        }
        score = 0
    }

    // 根据索引获取卡片的方法
    fun cardAtIndex(index: Int): Card {
        return cards[index]
    }

    // 常量，表示匹配失败的惩罚分数
    val MISMATCH_PENALTY = 2
    // 常量，表示匹配成功的奖励分数
    val MATCH_BONUS = 4
    // 常量，表示选择卡片的花费分数
    val COST_TO_CHOOSE = 1

    // 选择指定索引的卡片的方法，返回当前分数
    fun chooseCardAtIndex(index: Int): Int {
        val card = cardAtIndex(index)
        if (!card.isMatched) {
            if (card.isChosen) {
                card.isChosen = false
            } else {
                val chosenCards = cards.filter { it.isChosen && !it.isMatched }
                if (chosenCards.size == 1) {
                    val matchScore = card.match(chosenCards[0])
                    if (matchScore > 0) {
                        score += matchScore * MATCH_BONUS
                        chosenCards[0].isMatched = true
                        card.isMatched = true
                    } else {
                        score -= MISMATCH_PENALTY
                        chosenCards[0].isChosen = false
                        card.isChosen = false
                    }
                }
                score -= COST_TO_CHOOSE
                card.isChosen = true
            }
        }
        return score
    }
}